package com.member.common.utils;

import com.member.common.enums.OrderTypeEnum;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@Component
public class OrderNoCreate {

    private static StringRedisTemplate stringRedisTemplate;

    @Resource
    private void setStringRedisTemplate(StringRedisTemplate redisTemplate) {
        stringRedisTemplate = redisTemplate;
    }

    public static String activityOrderCode(String type) {
        String prefix = type.equals(OrderTypeEnum.ACTIVITY.name()) ? OrderTypeEnum.ACTIVITY.getDesc() : type.equals(OrderTypeEnum.GOODS.name()) ? OrderTypeEnum.GOODS.getDesc() : type.equals(OrderTypeEnum.SURPLUS.name()) ? OrderTypeEnum.SURPLUS.getDesc() : OrderTypeEnum.DEVELOP.getDesc();
        String key = type.equals(OrderTypeEnum.ACTIVITY.name()) ? OrderTypeEnum.ACTIVITY.getKey() : type.equals(OrderTypeEnum.GOODS.name()) ? OrderTypeEnum.GOODS.getKey() : type.equals(OrderTypeEnum.SURPLUS.name()) ? OrderTypeEnum.SURPLUS.getKey() : OrderTypeEnum.DEVELOP.getKey();
        // 这样写会存在 --> 订单号生成时会重复生成单号的问题
//        String value = stringRedisTemplate.opsForValue().get(key);
//        long codeNum = 0L;
//        if (value != null) {
//            codeNum = Long.parseLong(value);
//        }
//        codeNum = codeNum + 1L;
//        String serialNo = String.format("%06d", codeNum);
//        //设置缓存，调用此方法，会自动将key所对应的value+1，保存时长：今天剩余的时间
//        stringRedisTemplate.opsForValue().set(key, serialNo, getSeconds(), TimeUnit.SECONDS);
//
//
//        SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMdd");
//        Date date = new Date();
//        String dateRan = dmDate.format(date);

        // 使用 Redis 的 INCR 原子操作来生成自增的订单号
        Long codeNum = stringRedisTemplate.opsForValue().increment(key);// 如果不存在，则会创建并初始化为 1,这里不需要加1 因为上面的increment方法会自动加1
        if (codeNum == 1L) {
            // 首次递增时设置过期时间
            stringRedisTemplate.expire(key, getSeconds(), TimeUnit.SECONDS);
        }

        // 格式化为6位字符串（如 123 -> "000123"）
        String serialNo = String.format("%06d", codeNum);
        SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMdd");
        String dateRan = dmDate.format(new Date());

        return prefix + dateRan + serialNo;
    }

    public static String surplusOrderCode(String type) {
        String prefix = type.equals(OrderTypeEnum.ACTIVITY.name()) ? OrderTypeEnum.ACTIVITY.getDesc() : type.equals(OrderTypeEnum.GOODS.name()) ? OrderTypeEnum.GOODS.getDesc() : type.equals(OrderTypeEnum.SURPLUS.name()) ? OrderTypeEnum.SURPLUS.getDesc() : OrderTypeEnum.DEVELOP.getDesc();
        String key = type.equals(OrderTypeEnum.ACTIVITY.name()) ? OrderTypeEnum.ACTIVITY.getKey() : type.equals(OrderTypeEnum.GOODS.name()) ? OrderTypeEnum.GOODS.getKey() : type.equals(OrderTypeEnum.SURPLUS.name()) ? OrderTypeEnum.SURPLUS.getKey() : OrderTypeEnum.DEVELOP.getKey();
//        String value = stringRedisTemplate.opsForValue().get(key);
//        long codeNum = 0L;
//        if (value != null) {
//            codeNum = Long.parseLong(value);
//        }
//        codeNum = codeNum + 1L;
//        String serialNo = String.format("%05d", codeNum);
//        //设置缓存，调用此方法，会自动将key所对应的value+1，保存时长：今天剩余的时间
//        stringRedisTemplate.opsForValue().set(key, serialNo, getSeconds(), TimeUnit.SECONDS);
//        SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMdd");
//        Date date = new Date();
//        String dateRan = dmDate.format(date);

        // 使用 Redis 的 INCR 原子操作来生成自增的订单号
        Long codeNum = stringRedisTemplate.opsForValue().increment(key);// 如果不存在，则会创建并初始化为 1,这里不需要加1 因为上面的increment方法会自动加1
        if (codeNum == 1L) {
            // 首次递增时设置过期时间
            stringRedisTemplate.expire(key, getSeconds(), TimeUnit.SECONDS);
        }

        // 格式化为6位字符串（如 123 -> "000123"）
        String serialNo = String.format("%05d", codeNum);
        SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMdd");
        String dateRan = dmDate.format(new Date());

        return prefix + dateRan + serialNo;
    }

    public static String couponCode() {
        String prefix = OrderTypeEnum.COUPON.getDesc();
        String key = OrderTypeEnum.COUPON.getKey();
//        String value = stringRedisTemplate.opsForValue().get(key);
//        long codeNum = 0L;
//        if (value != null) {
//            codeNum = Long.parseLong(value);
//        }
//        codeNum = codeNum + 1L;
//        String serialNo = String.format("%03d", codeNum);
//        //设置缓存，调用此方法，会自动将key所对应的value+1，保存时长：今天剩余的时间
//        stringRedisTemplate.opsForValue().set(key, serialNo, getSeconds(), TimeUnit.SECONDS);
//        SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMdd");
//        Date date = new Date();
//        String dateRan = dmDate.format(date);

        // 使用 Redis 的 INCR 原子操作来生成自增的订单号
        Long codeNum = stringRedisTemplate.opsForValue().increment(key);// 如果不存在，则会创建并初始化为 1,这里不需要加1 因为上面的increment方法会自动加1
        if (codeNum == 1L) {
            // 首次递增时设置过期时间
            stringRedisTemplate.expire(key, getSeconds(), TimeUnit.SECONDS);
        }

        // 格式化为6位字符串（如 123 -> "000123"）
        String serialNo = String.format("%03d", codeNum);
        SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMdd");
        String dateRan = dmDate.format(new Date());

        return prefix + dateRan + serialNo;
    }

    public static String getRandom(int len) {
        Random r = new Random();
        StringBuilder rs = new StringBuilder();
        for (int i = 0; i < len; i++) {
            rs.append(r.nextInt(10));
        }
        return rs.toString();
    }

    /**
     * 获取当天结束还剩余多少秒
     */
    public static int getSeconds() {
        //获取今天当前时间
        Calendar curDate = Calendar.getInstance();
        //获取明天凌晨0点的日期
        Calendar tomorrowDate = new GregorianCalendar(
                curDate.get(Calendar.YEAR),
                curDate.get(Calendar.MONTH),
                curDate.get(Calendar.DATE) + 1,
                0, 0, 0);
        //返回 明天凌晨0点 和 今天当前时间 的差值（秒数）
        return (int) (tomorrowDate.getTimeInMillis() - curDate.getTimeInMillis()) / 1000;
    }
}
